package middleware

import (
	"strings"

	"crongo/internal/i18n"

	"github.com/gin-gonic/gin"
)

// I18nMiddleware 处理国际化中间件
func I18nMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 1. 优先从 URL 查询参数获取语言设置
		lang := c.Query("lang")

		// 2. 如果未指定，从 Cookie 获取
		if lang == "" {
			lang, _ = c.Cookie("lang")
		}

		// 3. 如果仍未指定，从 Accept-Language 头获取
		if lang == "" {
			lang = getLanguageFromHeader(c.GetHeader("Accept-Language"))
		}

		// 4. 获取对应的消息实例
		msg := i18n.GetMessage(lang)

		// 5. 将消息实例存储到上下文中
		c.Set("i18n", msg)

		// 6. 如果是从查询参数获取的语言设置，保存到 Cookie
		if c.Query("lang") != "" {
			c.SetCookie("lang", lang, 86400*30, "/", "", false, true)
		}

		c.Next()
	}
}

// getLanguageFromHeader 从 Accept-Language 头获取语言代码
func getLanguageFromHeader(header string) string {
	if header == "" {
		return i18n.LangEN
	}

	// 解析 Accept-Language 头
	// 示例: zh-CN,zh;q=0.9,en;q=0.8
	langs := strings.Split(header, ",")
	if len(langs) == 0 {
		return i18n.LangEN
	}

	// 获取首选语言
	primaryLang := strings.Split(langs[0], ";")[0]
	return strings.TrimSpace(primaryLang)
}
